home *** CD-ROM | disk | FTP | other *** search
/ Die Speccy' 97 / Die Speccy' 97.iso / amiga_system / the_aminet / util / cli / hexer.lha / Hexer / Hexer.mod < prev    next >
Text File  |  1995-10-04  |  3KB  |  136 lines

  1. MODULE Hexer;
  2.  
  3. FROM Arguments   IMPORT NumArgs, GetArg;
  4. FROM Arts        IMPORT wbStarted, Terminate;
  5. FROM Break       IMPORT InstallException;
  6. FROM Conversions IMPORT StrToVal, ValToStr;
  7. FROM InOut       IMPORT Write, WriteLn, WriteString;
  8. FROM SeqIO       IMPORT SeqKey, OpenSeqIn, OpenSeqOut, CloseSeq, SeqOk,
  9.                         SeqInB, SeqOutB, SeqInLen, SeqOutCount;
  10. FROM SYSTEM      IMPORT ADR;
  11.  
  12. IMPORT A = ASCII;
  13.  
  14. CONST  Text1 = " : ";
  15.  
  16. VAR
  17.   In, Out, CharSet        : SeqKey;
  18.   InName, OutName,Str,
  19.   CharSetName,WordBuf     : ARRAY [0..255] OF CHAR;
  20.   Printable               : ARRAY CHAR     OF BOOLEAN;
  21.   MinLen, WordLen,
  22.   i, act, Pos, Len        : LONGINT;
  23.   c, cMax                 : CHAR;
  24.   int                     : INTEGER;
  25.   Err,WordPool,OnlySpaces : BOOLEAN;
  26.  
  27. BEGIN
  28.   InstallException;
  29.   IF wbStarted THEN Terminate; END;
  30.  
  31.   IF (NumArgs() < 3) THEN
  32.     WriteString("Hexer 1.0 Copyright (c) 1995 by Dirk Held\n\n");
  33.     WriteString("usage : Hexer <InFile> <OutFile> <MinWordLen> [CharSetFile]\n\n");
  34.     Terminate;
  35.   END;
  36.  
  37.   GetArg(1, InName,  int);
  38.   IF NOT OpenSeqIn(In, InName, 4000) THEN
  39.     WriteString("Error while opening Infile !\n");
  40.     Terminate;
  41.   END;
  42.  
  43.   GetArg(2, OutName, int);
  44.   IF NOT OpenSeqOut(Out,  OutName,  4000) THEN
  45.     WriteString("Error while opening OutFile !\n");
  46.     Terminate;
  47.   END;
  48.  
  49.   GetArg(3, Str,     int);
  50.   StrToVal(Str, MinLen, Err, 10, Err);
  51.   IF (MinLen < 2) OR (MinLen > 255) THEN
  52.     WriteString("MinWordLen is not within usable Range !\n");
  53.     Terminate;
  54.   END;
  55.  
  56.   IF (NumArgs() = 4) THEN
  57.     GetArg(4, CharSetName,  int);
  58.     IF NOT OpenSeqIn(CharSet, CharSetName, 256) THEN
  59.       WriteString("Error while opening CharSetfile !\n");
  60.       Terminate;
  61.     END;
  62.  
  63.     WordPool := TRUE; cMax := A.nul;
  64.     FOR c := A.nul TO 377C DO Printable[c] := FALSE; END;
  65.     FOR Pos := 1 TO SeqInLen(CharSet) DO
  66.  
  67.       c := SeqInB(CharSet);
  68.       IF (c > cMax) THEN cMax := c; END;
  69.       Printable[c] := TRUE;
  70.  
  71.     END;
  72.  
  73.     IF (cMax >= 200C) THEN WordPool := FALSE; ELSE WordPool := TRUE; END;
  74.  
  75.   ELSE
  76.  
  77.     WordPool := TRUE;
  78.     FOR c := A.nul TO A.us DO Printable[c] := FALSE; END;
  79.     FOR c := A.sp  TO 176C DO Printable[c] := TRUE;  END;
  80.     FOR c := A.del TO 377C DO Printable[c] := FALSE; END;
  81.  
  82.   END;
  83.  
  84.   WordLen := 0; Len := SeqInLen(In) - 1; OnlySpaces := TRUE;
  85.  
  86.   FOR Pos := 0 TO Len DO
  87.  
  88.     c := SeqInB(In);
  89.  
  90.     IF NOT SeqOk(In) THEN
  91.       WriteString("Error while reading InFile !\n");
  92.       Terminate;
  93.     END;
  94.  
  95.     IF Printable[c] THEN
  96.  
  97.       WordBuf[WordLen] := c; INC(WordLen);
  98.       IF (c # A.sp) THEN OnlySpaces := FALSE; END;
  99.  
  100.     ELSE
  101.  
  102.       IF WordPool AND (c >= 240C) AND Printable[CHR(ORD(c)-128)] THEN
  103.  
  104.         WordBuf[WordLen] := CHR(ORD(c)-128); INC(WordLen);
  105.  
  106.       END;
  107.  
  108.       IF (WordLen >= MinLen) AND NOT OnlySpaces THEN
  109.  
  110.         ValToStr(Pos, FALSE, Str, 16, 8, " ", Err);
  111.  
  112.         SeqOutCount(Out, ADR(Str),     8      );
  113.         SeqOutCount(Out, ADR(Text1),   3      );
  114.         SeqOutCount(Out, ADR(WordBuf), WordLen);
  115.         SeqOutB    (Out, A.eol);
  116.  
  117.         IF NOT SeqOk(Out) THEN
  118.           WriteString("Error while writing OutFile !\n");
  119.           Terminate;
  120.         END;
  121.  
  122.       END;
  123.  
  124.       WordLen := 0; OnlySpaces := TRUE;
  125.  
  126.     END;
  127.   END;
  128.  
  129.   WriteString("All done !\n");
  130.  
  131. CLOSE
  132.  
  133.   CloseSeq(In);  CloseSeq(Out); CloseSeq(CharSet);
  134.  
  135. END Hexer.
  136.